4/5
D. Three Religions
题意
给出一个长度为 $n$ 的字符串,每个字符可以属于三个子序列中的任意一个(只能被一个子序列拥有),一开始三个子序列都为空,有 $q$ 次询问,每次询问有三个属性,给第 $i$ 个子序列增加/减少一个字符 $c$,问每次询问的合法性。
$(n\le 10^5,q\le10 ^4)$,每个子序列长度最长为 $250$。
题解
- 显然对于每个子序列每个字符选取的位置是关键的,这个可以转化为每个子序列字符选取的顺序。
- 定义:$dp[i][j][k]$ 表示第一个子序列匹配了前i个字符,第二个子序列的字符匹配了前j个,第三个子序列匹配了前k个字符的最后一个字符的位置。
- 为什么上面这个东西一定是对的,这样枚举了三个子序列每个中的每个字符摆放相对顺序,求出来的一定是一个最小位置。
- 代价也是显然易见的,每次增加看起来都要重新求 $n^3$ 个状态,仔细观察只有 $n ^ 2$ 个。
- 上面的东西,显然需要一个序列自动机预处理一下。
- 维护上面的dp是 $n^3$ 的,显然对于每次询问都这样处理是不可行的。
- 观察可以发现,每次任意一个子序列增加一个字符,只有 $n^2$个状态会修改。
- 时间复杂度: $O(q·n^2)$
代码
1 |
|